package 手写ArraryList集合;

import java.util.Arrays;

/**
 * @Auther:云尚学Java
 */
public class MyArrayList<E> implements MyList<E> {
    //ArrayList集合底层的数据结构，用来存储元素
    Object[] elementDate;
    //代表向集合中(数组中)实际存储元素的个数
    int size;

    public  MyArrayList(int initialCapacity){
        if(initialCapacity>=0){
            elementDate=new Object[initialCapacity];
        }else{
            //抛出异常
            System.out.println("给定的初始化空间长度不合法");
        }
    }
    public MyArrayList(){
        this(10);
    }
    //1.给集合中新增元素的方法
    @Override
    public void add(E element) {
        //扩容
        ensureCapacity();
        elementDate[size++]=element;
    }
    //2.获取集合中实际存储元素个数的方法
    @Override
    public int size() {
        return size;
    }
    //3.依据索引获取元素的方法
    @Override
    public E get(int index) {
        //判断索引合法性
        rangeCheck(index);
        return elementDate(index);
    }
    //4.指定位置添加元素的方法
    @Override
    public void add(int index, E element) {
        rangeCheck(index);
        ensureCapacity();
        System.arraycopy(elementDate,index,elementDate,index+1,size-index);//1 2 3 4 5
        elementDate[index]=element;
        ++size;
    }
    //5.判断集合中是否包含指定元素的方法
    @Override
    public boolean contains(Object o) {
        return indexOf(o)>=0;
    }
    //6.依据指定的元素返回该元素在集合中所对应索引位置的方法
    @Override
    public int indexOf(Object o) {
        for(int i=0;i<size;i++){
            if(elementDate[i].equals(o)){
                return i;
            }
        }
        return -1;
    }
    //7.依据索引删除元素的方法
    @Override
    public E remove(int index) {
        rangeCheck(index);
        E oldValue=elementDate(index);//1 3 4 5
        System.arraycopy(elementDate,index+1,elementDate,index,size-index-1);
        elementDate[--size]=null;

        return oldValue;
    }
    //8.依据指定的元素直接删除集合中元素的方法
    @Override
    public boolean remove(E element) {
        for(int i=0;i<size;i++){
            if(elementDate[i].equals(element)){
                remove(i);
                return true;
            }
        }
        return false;
    }
    //9.判断集合是否为空
    @Override
    public boolean isEmpty() {
        return size==0;
    }

    @Override
    public E set(int index, E element) {
        rangeCheck(index);
        E oldValue=elementDate(index);
        elementDate[index]=element;
        return oldValue;
    }

    //数组扩容放入方法
    private void ensureCapacity(){
        //1.数据空间长度是否够用
        if(size>=elementDate.length){
            elementDate= Arrays.copyOf(elementDate,size*2+1);

        }
    }

    private E elementDate(int index){
        return (E) elementDate[index];
    }

    //判断索引合法性
    private void rangeCheck(int index){
        if(index<0||index>+size){
            //抛出异常
            System.out.println("索引非法");
        }
    }

}
